package br.com.ff.manager.managebean;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIParameter;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;

import br.com.ff.common.StatusEnum;
import br.com.ff.common.exception.EntidadeDuplicadaException;
import br.com.ff.manager.managebean.base.BaseManagedBean;
import br.com.ff.usuario.session.UsuarioLocal;
import br.com.ff.usuario.to.UsuarioTO;

public class CrudUsuario extends BaseManagedBean {
	
	@EJB
	UsuarioLocal usuarioLocal;

	private UsuarioTO usuarioTO = new UsuarioTO();
	
	private List<UsuarioTO> usuarios = new ArrayList<UsuarioTO>();
	
	private String senha1;
	
	private String senha2;
	
	private List<SelectItem> listaStatus = new ArrayList<SelectItem>();
	
	private int statusValue;
	
	private boolean exibirTabela = false;
	
	public String consultar() throws IOException {
		UsuarioTO usuarioParam = new UsuarioTO();
		usuarioParam.setLogin(usuarioTO.getLogin());
		
		usuarios = usuarioLocal.findByParams(usuarioParam);
		
		return "success";
	}
	
	public String goIncluir() throws IOException {
		usuarioTO = new UsuarioTO();
		return "go_salvar";
	}
	
	public void goEditar(ActionEvent event) throws IOException {
		UIParameter component = (UIParameter) event.getComponent().findComponent("id");
		Long id = (Long)component.getValue();
		
		usuarioTO = getUsuarioLocal().findById(id);
		
		redirecionarPara("salvarUsuario.xhtml");
	}
	
	public String salvar() throws IOException {
		
		String login = getUsuarioTO().getLogin();
		Date dataExpirar = getUsuarioTO().getDataExpirar();
		
		String senha1 = getSenha1();
		String senha2 = getSenha2();
		
		if (login.equals("")) {
			FacesContext.getCurrentInstance().addMessage("", new FacesMessage("Login e obrigatorio."));
		}
		
		if (dataExpirar == null) {
			FacesContext.getCurrentInstance().addMessage("", new FacesMessage("Date de expiracao e obrigatorio."));
		}
		
		if (getStatusValue() < 1) {
			FacesContext.getCurrentInstance().addMessage("", new FacesMessage("Status e obrigatorio."));
		}
		
		if (!senha1.equals("") || !senha2.equals(""))  {
			if (!senha1.equals(senha2)) {
				FacesContext.getCurrentInstance().addMessage("", new FacesMessage("Senhas nao sao iguais."));
			} else {
				getUsuarioTO().setPassword(senha1);
			}
		}
		
		if (getUsuarioTO().getPassword() == null || getUsuarioTO().getPassword().equals("")) {
			FacesContext.getCurrentInstance().addMessage("", new FacesMessage("Senha e obrigatorio."));
		}
		
		if (FacesContext.getCurrentInstance().getMessages().hasNext()) {
			return "";
		}
			
		if (getStatusValue() == 1) {
			usuarioTO.setStatus(StatusEnum.ATIVO);
		} else {
			usuarioTO.setStatus(StatusEnum.INATIVO);
		}		
		
		try {
			if (usuarioTO.getId() != null) {
				usuarioLocal.atualizar(usuarioTO);
			} else {
				usuarioLocal.salvar(usuarioTO);
			}
		} catch (EntidadeDuplicadaException e) {
			FacesContext.getCurrentInstance().addMessage("", new FacesMessage(e.getMessage()));
			return "";
		}
		
		limpar();
		
		redirecionarPara("msgSucesso.xhtml?url=consultarUsuario.xhtml");
		
		return "success";
	}
	
	public void remover(ActionEvent event) throws IOException {
		
		UIParameter component = (UIParameter) event.getComponent().findComponent("id");
		Long id = (Long)component.getValue();
		getUsuarioLocal().remover(id);
		
		limpar();
		redirecionarPara("msgSucesso.xhtml?url=consultarUsuario.xhtml");
		
	}
	
	private void limpar() {
		usuarios = new ArrayList<UsuarioTO>();
		usuarioTO = new UsuarioTO();
	}
	
	public List<UsuarioTO> getUsuarios() {
		return usuarios;
	}

	public void setUsuarios(List<UsuarioTO> usuarios) {
		this.usuarios = usuarios;
	}

	public br.com.ff.usuario.to.UsuarioTO getUsuarioTO() {
		return usuarioTO;
	}

	public void setUsuarioTO(br.com.ff.usuario.to.UsuarioTO usuarioTO) {
		this.usuarioTO = usuarioTO;
	}

	public UsuarioLocal getUsuarioLocal() {
		return usuarioLocal;
	}

	public void setUsuarioLocal(UsuarioLocal usuarioLocal) {
		this.usuarioLocal = usuarioLocal;
	}

	public String getSenha1() {
		return senha1;
	}

	public void setSenha1(String senha1) {
		this.senha1 = senha1;
	}

	public String getSenha2() {
		return senha2;
	}

	public void setSenha2(String senha2) {
		this.senha2 = senha2;
	}
	
	public List<SelectItem> getListaStatus() {
		
		if (listaStatus.isEmpty()) {
			listaStatus = gerarListStatus();
		}
		return listaStatus;
		
	}

	public void setListaStatus(List<SelectItem> listaStatus) {
		this.listaStatus = listaStatus;
	}

	public int getStatusValue() {
		return statusValue;
	}

	public void setStatusValue(int statusValue) {
		this.statusValue = statusValue;
	}

	public boolean isExibirTabela() {
		if (!usuarios.isEmpty()) {
			exibirTabela = true; 
		}
		return exibirTabela;
	}

	public void setExibirTabela(boolean exibirTabela) {
		this.exibirTabela = exibirTabela;
	}
}
